package com.kotlin.lib.coroutines

import kotlinx.coroutines.*
import java.io.IOException

/**
 * 当协程的多个子协程因异常而失败时， 一般规则是“取第一个异常”，因此将处理第一个异常。
 * 在第一个异常之后发生的所有其他异常都作为被抑制的异常绑定至第一个异常。
 */
fun main() = runBlocking<Unit> {
    val handler = CoroutineExceptionHandler { coroutineContext, throwable ->
        println("got exception:$throwable, suppressed exception:${throwable.suppressedExceptions}")
    }

    val job = GlobalScope.launch(handler) {
        launch {
            try {
                delay(Long.MAX_VALUE)
            } finally {
                throw ArithmeticException()
            }
        }

        launch {
            delay(100)
            throw IOException()
        }

//        delay(Long.MAX_VALUE)
    }
    job.join()



}